package com.mindskip.xzs.service.impl;

import com.mindskip.xzs.domain.Message;
import com.mindskip.xzs.domain.MessageUser;
import com.mindskip.xzs.repository.MessageMapper;
import com.mindskip.xzs.repository.MessageUserMapper;
import com.mindskip.xzs.service.MessageService;
import com.mindskip.xzs.viewmodel.admin.message.MessagePageRequestVM;
import com.mindskip.xzs.viewmodel.student.user.MessageRequestVM;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

@Service // 表示这是一个服务层的组件
public class MessageServiceImpl implements MessageService {

    private final MessageMapper messageMapper; // 注入消息Mapper
    private final MessageUserMapper messageUserMapper; // 注入消息用户Mapper

    @Autowired // 使用构造函数注入依赖
    public MessageServiceImpl(MessageMapper messageMapper, MessageUserMapper messageUserMapper) {
        this.messageMapper = messageMapper;
        this.messageUserMapper = messageUserMapper;
    }

    @Override
    public List<Message> selectMessageByIds(List<Integer> ids) {
        return messageMapper.selectByIds(ids); // 通过ID列表查询消息
    }

    @Override
    public PageInfo<MessageUser> studentPage(MessageRequestVM requestVM) {
        // 使用PageHelper进行分页，并按ID降序排列
        return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->
                messageUserMapper.studentPage(requestVM)
        );
    }

    @Override
    public PageInfo<Message> page(MessagePageRequestVM requestVM) {
        // 使用PageHelper进行分页，并按ID降序排列
        return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->
                messageMapper.page(requestVM)
        );
    }

    @Override
    public List<MessageUser> selectByMessageIds(List<Integer> ids) {
        return messageUserMapper.selectByMessageIds(ids); // 通过消息ID列表查询消息用户
    }

    @Override
    @Transactional // 事务管理，确保操作的原子性
    public void sendMessage(Message message, List<MessageUser> messageUsers) {
        messageMapper.insertSelective(message); // 插入消息
        messageUsers.forEach(d -> d.setMessageId(message.getId())); // 设置每个消息用户的消息ID
        messageUserMapper.inserts(messageUsers); // 批量插入消息用户
    }

    @Override
    @Transactional // 事务管理，确保操作的原子性
    public void read(Integer id) {
        MessageUser messageUser = messageUserMapper.selectByPrimaryKey(id); // 根据主键查询消息用户
        if (messageUser.getReaded())
            return; // 如果消息已读，直接返回
        messageUser.setReaded(true); // 设置消息为已读
        messageUser.setReadTime(new Date()); // 设置读取时间
        messageUserMapper.updateByPrimaryKeySelective(messageUser); // 更新消息用户
        messageMapper.readAdd(messageUser.getMessageId()); // 增加消息的已读计数
    }

    @Override
    public Integer unReadCount(Integer userId) {
        return messageUserMapper.unReadCount(userId); // 查询未读消息数
    }

    @Override
    public Message messageDetail(Integer id) {
        MessageUser messageUser = messageUserMapper.selectByPrimaryKey(id); // 根据主键查询消息用户
        return messageMapper.selectByPrimaryKey(messageUser.getMessageId()); // 根据消息用户的消息ID查询消息详情
    }

}
